package com.baor.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baor.dao.*;
import com.baor.domain.GoodsVo;
import com.baor.domain.SeparateVo;
import com.baor.domain.ServiceVo;
import com.baor.domain.SpecificationVo;
import com.baor.domain.conf.SeparateConf;
import com.baor.enums.FuncEnum;
import com.baor.service.GoodsService;
import com.baor.utils.AjaxResult;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class GoodsServiceImpl implements GoodsService {

    @Autowired
    private SeparateDao separateDao;
    @Autowired
    private GoodsDao goodsDao;
    @Autowired
    private SeparateConfDao separateConfDao;
    @Autowired
    private ServiceDao serviceDao;
    @Autowired
    private SpecificationDao specificationDao;

    @Override
    public AjaxResult<?> list(Map<String, Object> params) {
//        Map<String, Object> res = new HashMap<>();

        //商品分类
        //所有分类
        LambdaQueryWrapper<SeparateVo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SeparateVo::getDelflag, 0)
                .eq(SeparateVo::getSiteId, params.get("siteId"))
                .orderByAsc(SeparateVo::getSeparateId);
        List<SeparateVo> all = separateDao.selectList(queryWrapper);
        //父级分类
//        List<SeparateVo> parent = separateDao.selectList(new LambdaQueryWrapper<SeparateVo>()
//                .eq(SeparateVo::getSeparateSuperior, 0)
//                .eq(SeparateVo::getDelflag,0));
        List<SeparateVo> parent = all.stream().filter(x -> x.getSeparateSuperior().toString().equals("0")).collect(Collectors.toList());
        for(SeparateVo p : parent)
//            for(SeparateVo c : child){
//                p.setGoodsList(goodsDao.selectList(new LambdaQueryWrapper<GoodsVo>().in(GoodsVo::getSeparateId, params.get("separateId"))));
//            }
            p.setChildren(getChild(all, p.getSeparateId()));
//        }
        return AjaxResult.success(parent);
    }

    @Override
    public AjaxResult<?> search(Map<String, Object> params) {
        List<GoodsVo> goods = goodsDao.selectList(new LambdaQueryWrapper<GoodsVo>().like(GoodsVo::getGoodsName, params.get("goodsName")));
        return AjaxResult.success(goods);
    }

    @Override
    public AjaxResult<?> goodsList(Map<String, Object> map) {
//        LambdaQueryWrapper<GoodsVo> queryWrapper = new LambdaQueryWrapper<>();
//        queryWrapper.eq(GoodsVo::getDelFlag, 0).eq(GoodsVo::getSiteId, params.get("siteId"));

//                if (params.containsKey("separateId")) {
//                    queryWrapper.eq(GoodsVo::getSeparateId, params.get("separateId"));
//                } else {
//                    SeparateVo separateVo = separateDao.selectList(new LambdaQueryWrapper<SeparateVo>().orderByAsc(SeparateVo::getSeparateId)).stream().findFirst().get();
//                    queryWrapper.eq(GoodsVo::getSeparateId,separateVo.getSeparateId());
//                }
//        List<GoodsVo> goods = goodsDao.selectList(queryWrapper);

        // 使用 Collections.sort() 方法进行排序
//                Collections.sort(goods, new Comparator<GoodsVo>() {
//                    @Override
//                    public int compare(GoodsVo g1, GoodsVo g2) {
//                        // 根据 goodsVolume 降序排序
//                        return Double.compare(Double.valueOf(g2.getGoodsCheating()), Double.valueOf(g1.getGoodsCheating()));
//                    }
//                });
//                int currentPage = (int) params.get("pageIndex"); // 当前页数 int pageSize = 10; // 每页显示的条数
//                int pageSize = (int) params.get("pageSize"); // 每页显示的条数
//                int start = (currentPage - 1) * pageSize; // 分页起始位置
//                int end = Math.min(start + pageSize, goods.size()); // 分页结束位置
//                List<GoodsVo> pageGoodsList = goods.subList(start, end); // 获取分页后的商品列表
//        LambdaQueryWrapper<SeparateVo> queryWrapper2 = new LambdaQueryWrapper<>();
//        queryWrapper2.eq(SeparateVo::getDelflag, 0).eq(SeparateVo::getSiteId, params.get("siteId"));
//        List<SeparateVo> all = separateDao.selectList(queryWrapper2);
//        Map<String, Object> res = new HashMap<>();
//        int total = goods.size();
//        res.put("goods", pageGoodsList);
//        res.put("separate", all);
//        res.put("total", total);
        if ( map.get("siteId") == null || "".equals(map.get("siteId")) )
            return AjaxResult.error("siteId is null T-T");
        MPJLambdaWrapper<GoodsVo> mpj = getMpj();
        if ( map.get("separateId") == null || "".equals(map.get("separateId")) )
            mpj.in(GoodsVo::getSeparateId,separateDao.selectList(new LambdaQueryWrapper<SeparateVo>()
                    .eq(SeparateVo::getSiteId,map.get("siteId"))
                    .eq(SeparateVo::getDelflag,0)
                    .eq(SeparateVo::getSeparateStatus,"是")
                    .eq(SeparateVo::getSeparateSuperior,0)
                    .orderByAsc(SeparateVo::getSeparateId)).stream().findFirst().get().getSeparateId());
        else if ( map.get("separateId").toString().equals("0") )
            mpj.in(GoodsVo::getSeparateId, separateDao.selectList(new LambdaQueryWrapper<SeparateVo>()
                            .eq(SeparateVo::getSiteId,map.get("siteId"))
                            .eq(SeparateVo::getDelflag,0)
                            .eq(SeparateVo::getSeparateStatus,"是")
                            .eq(SeparateVo::getSeparateSuperior,0)).stream()
                    .map(x -> x.getSeparateId()).collect(Collectors.toList()));
        else if ( map.get("separateId") != null || !"".equals(map.get("separateId")) )
            mpj.in(GoodsVo::getSeparateId,map.get("separateId"));
        mpj
            .eq(GoodsVo::getSiteId,map.get("siteId"))
            .eq(GoodsVo::getDelFlag,0);
        Page<GoodsVo> page = goodsDao.selectPage(getPage(map), mpj);
        //-------- 结果处理 --------
        List<GoodsVo> records = page.getRecords();
//        records.stream().
        long pages = page.getPages();
        //-------- 数据封装 --------
        Map<String,Object> res = new HashMap<>();
        res.put("pageCount",pages);
        res.put("list",records);
        return AjaxResult.success(res);
    }

    private Page<GoodsVo> getPage(Map<String,Object> map){
        if ( map.get("pageIndex") == null || "".equals(map.get("pageIndex")) )
            map.put("pageIndex",1);
        if ( map.get("pageSize") == null || "".equals(map.get("pageSize")) )
            map.put("pageSize",10);
        Long pageIndex = Long.valueOf(map.get("pageIndex").toString());
        Long pageSize = Long.valueOf(map.get("pageSize").toString());
        return new Page<>(pageIndex,pageSize);
    }


    private MPJLambdaWrapper<GoodsVo> getMpj(){
        MPJLambdaWrapper<GoodsVo> mpj = new MPJLambdaWrapper<>();
        mpj
                .selectAll(GoodsVo.class);//不需要第二行的话,第一行一同删除,用这行代替
        return mpj;
    }


    @Override
    public AjaxResult<?> goodsInfo(Map<String, Object> params) {
        int goodsId = (int) params.get("goodsId");
        GoodsVo goods = goodsDao.selectById(goodsId);
        if(goods.getSpecificationState() == 1){
            goods.setSpecification(specificationDao.selectList(new QueryWrapper<SpecificationVo>().eq("goods_id", goodsId)));
        }
        //服务
        goods.setGoodsSend(serviceDao.selectById(goods.getGoodsSend()).getServiceName());
        Map<String, Object> res = new HashMap<>();
        res.put("goods", goods);
        //分割线
        res.put("separateGoods", goodsDao.selectList(new LambdaQueryWrapper<GoodsVo>().in(GoodsVo::getSeparateId, goods.getSeparateId()).last("limit 2")));
        return AjaxResult.success(res);
    }

    @Override
    public AjaxResult<?> separateConf(Map<String, Object> params) {
        SeparateConf separateConf = separateConfDao.selectOne(new LambdaQueryWrapper<SeparateConf>().eq(SeparateConf::getSiteId, params.get("siteId")));

        return AjaxResult.success(separateConf);
    }


    public List<SeparateVo> getChild(List<SeparateVo> all,int id){
        List<SeparateVo> child = new ArrayList<>();
        for(SeparateVo s : all){
            if(Integer.parseInt(s.getSeparateSuperior()) == id){
//                List<SeparateVo> c = getChild(all, s.getSeparateId());
//                s.setGoodsList(goodsDao.selectList(new LambdaQueryWrapper<GoodsVo>().in(GoodsVo::getSeparateId, s.getSeparateId())));
//                child.add(s);
                getChild(all, s.getSeparateId());
                child.add(s);
            }
        }
        return child;
    }
}
